package com.merry.beanFactory.ac;

import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.MessageSource;
import org.springframework.core.env.EnvironmentCapable;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.lang.Nullable;

/**
 * ApplicationContext 的顶层接口：
 *      这个接口只允许读，当这个容器启动的时候，但是也许它的子类可以实现重新加载。
 *
 * 一个 ApplicationContext 容器提供：
 *      ListableBeanFactory：具有获取bean、遍历bean的能力。
 *      HierarchicalBeanFactory：具有容器隔离的能力。
 *      ResourceLoader：具有资源加载的能力。
 *      ApplicationEventPublisher：具有事件发布的能力。
 *      MessageSource：具有国际化的能力，i18n。
 *
 * 从父上下文继承。后代上下文中的定义将始终优先。例如，这意味着单亲家庭
 * 上下文可以由整个web应用程序使用，而每个servlet都有自己的子上下文，该子上下文独立于任何其他servlet的子上下文。
 */
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
        MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

    /**
     * 获取容器的唯一ID。
     */
    @Nullable
    String getId();

    /**
     * 获取容器的name。
     */
    String getApplicationName();

    /**
     * 获取容器友好的name。
     */
    String getDisplayName();

    /**
     * 获取容器的加载时间。
     */
    long getStartupDate();

    /**
     * 获取容器的父容器。
     */
    @Nullable
    ApplicationContext getParent();

    /**
     * 为此上下文公开AutowireCapableBeanFactory功能。这通常不会被应用程序代码使用，除非是为了初始化位于应用程序上下文之外的bean实例，
     *      将Spring bean生命周期（全部或部分）应用于它们。或者，内部BeanFactory被 {@link ConfigurableApplicationContext}界面提供对
     *      {@link AutowireCapableBeanFactory}接口也是如此。本方法主要用作ApplicationContext接口上的方便、特定的工具。
     * 注意：从4.2开始，此方法将在应用程序上下文关闭后持续抛出IllegalStateException。
     * 在当前的Spring Framework版本中，只有可刷新的应用程序上下文才有这种行为；
     * 从4.2开始，所有应用程序上下文实现都需要遵守。
     */
    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;

}

